<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>iterator</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="tag-developers-guide.html">Tag Developers Guide</a>&nbsp;&gt;&nbsp;<a href="struts-tags.html">Struts Tags</a>&nbsp;&gt;&nbsp;<a href="tag-reference.html">Tag Reference</a>&nbsp;&gt;&nbsp;<a href="generic-tag-reference.html">Generic Tag Reference</a>&nbsp;&gt;&nbsp;<a href="iterator.html">iterator</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">iterator</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=13893">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=13893">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=13893">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=13893">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=13893">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=13893">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Please make sure you have read the <a shape="rect" href="tag-syntax.html">Tag Syntax</a> document and understand how tag attribute syntax works.</p></div></div>
<div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>The <code>id</code> attribute is deprecated in Struts 2.1.x, and has been replaced by the <code>var</code> attribute.</p></div></div>
<div class="confluence-information-macro confluence-information-macro-warning"><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>The <code>begin</code>, <code>end</code> and <code>step</code> attributes are only available from 2.1.7 on</p></div></div>

<h2 id="iterator-Description">Description</h2>


<p></p><p>Iterator will iterate over a value. An iterable value can be any of: java.util.Collection, java.util.Iterator,
java.util.Enumeration, java.util.Map, or an array.</p>


<h1 id="iterator-Parameters">Parameters</h1>

<p><table width="100%"><tr><td colspan="6" rowspan="1"><h4>Dynamic Attributes Allowed:</h4> false</td></tr><tr><td colspan="6" rowspan="1">&#160;</td></tr><tr><th align="left" colspan="1" rowspan="1" valign="top"><h4>Name</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Required</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Default</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Evaluated</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Type</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Description</h4></th></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">begin</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">0</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Integer</td><td align="left" colspan="1" rowspan="1" valign="top">if specified the iteration will start on that index</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">end</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Size of the 'values' List or array, or 0 if 'step' is negative</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Integer</td><td align="left" colspan="1" rowspan="1" valign="top">if specified the iteration will end on that index(inclusive)</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">id</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Deprecated. Use 'var' instead</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">status</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Boolean</td><td align="left" colspan="1" rowspan="1" valign="top">If specified, an instanceof IteratorStatus will be pushed into stack upon each iteration</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">step</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">1</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Integer</td><td align="left" colspan="1" rowspan="1" valign="top">if specified the iteration index will be increased by this value on each iteration. It can be a negative value, in which case 'begin' must be greater than 'end'</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">value</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">the iteratable source to iterate over, else an the object itself will be put into a newly created List</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">var</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Name used to reference the value pushed into the Value Stack</td></tr></table></p>

<h1 id="iterator-Examples">Examples</h1>


<p></p><p>The following example retrieves the value of the getDays() method of the current object on the value stack and
uses it to iterate over. The &lt;s:property/&gt; tag prints out the current value of the iterator.</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
&lt;s:iterator value=&quot;days&quot;&gt;
  &lt;p&gt;day is: &lt;s:property/&gt;&lt;/p&gt;
&lt;/s:iterator&gt;
]]></script>
</div></div>


<p></p><p>The following example uses a Bean tag and places it into the ActionContext. The iterator tag will retrieve
that object from the ActionContext and then calls its getDays() method as above. The status attribute is also used to
create an IteratorStatus object, which in this example, its odd() method is used to alternate row
colours:</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

&lt;s:bean name=&quot;org.apache.struts2.example.IteratorExample&quot; var=&quot;it&quot;&gt;
  &lt;s:param name=&quot;day&quot; value=&quot;&#39;foo&#39;&quot;/&gt;
  &lt;s:param name=&quot;day&quot; value=&quot;&#39;bar&#39;&quot;/&gt;
&lt;/s:bean&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;1&quot;&gt;
&lt;tr&gt;
  &lt;th&gt;Days of the week&lt;/th&gt;
&lt;/tr&gt;

&lt;s:iterator value=&quot;#it.days&quot; status=&quot;rowstatus&quot;&gt;
  &lt;tr&gt;
    &lt;s:if test=&quot;#rowstatus.odd == true&quot;&gt;
      &lt;td style=&quot;background: grey&quot;&gt;&lt;s:property/&gt;&lt;/td&gt;
    &lt;/s:if&gt;
    &lt;s:else&gt;
      &lt;td&gt;&lt;s:property/&gt;&lt;/td&gt;
    &lt;/s:else&gt;
  &lt;/tr&gt;
&lt;/s:iterator&gt;
&lt;/table&gt;

]]></script>
</div></div>


<p></p><p> The next example will further demonstrate the use of the status attribute, using a DAO obtained from the action
class through OGNL, iterating over groups and their users (in a security context). The last() method indicates if the
current object is the last available in the iteration, and if not, we need to separate the users using a comma: </p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

 &lt;s:iterator value=&quot;groupDao.groups&quot; status=&quot;groupStatus&quot;&gt;
     &lt;tr class=&quot;&lt;s:if test=&quot;#groupStatus.odd == true &quot;&gt;odd&lt;/s:if&gt;&lt;s:else&gt;even&lt;/s:else&gt;&quot;&gt;
         &lt;td&gt;&lt;s:property value=&quot;name&quot; /&gt;&lt;/td&gt;
         &lt;td&gt;&lt;s:property value=&quot;description&quot; /&gt;&lt;/td&gt;
         &lt;td&gt;
             &lt;s:iterator value=&quot;users&quot; status=&quot;userStatus&quot;&gt;
                 &lt;s:property value=&quot;fullName&quot; /&gt;&lt;s:if test=&quot;!#userStatus.last&quot;&gt;,&lt;/s:if&gt;
             &lt;/s:iterator&gt;
         &lt;/td&gt;
     &lt;/tr&gt;
 &lt;/s:iterator&gt;

]]></script>
</div></div>


<p></p><p> The next example iterates over a an action collection and passes every iterator value to another action. The
trick here lies in the use of the '[0]' operator. It takes the current iterator value and passes it on to the edit
action. Using the '[0]' operator has the same effect as using &lt;s:property /&gt;. (The latter, however, does not
work from inside the param tag). </p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

     &lt;s:action name=&quot;entries&quot; var=&quot;entries&quot;/&gt;
     &lt;s:iterator value=&quot;#entries.entries&quot; &gt;
         &lt;s:property value=&quot;name&quot; /&gt;
         &lt;s:property /&gt;
         &lt;s:push value=&quot;...&quot;&gt;
             &lt;s:action name=&quot;edit&quot; var=&quot;edit&quot; &gt;
                 &lt;s:param name=&quot;entry&quot; value=&quot;[0]&quot; /&gt;
             &lt;/s:action&gt;
         &lt;/push&gt;
     &lt;/s:iterator&gt;

]]></script>
</div></div>


<p></p><p>A loop that iterates 5 times</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

&lt;s:iterator var=&quot;counter&quot; begin=&quot;1&quot; end=&quot;5&quot; &gt;
   &lt;!-- current iteration value (1, ... 5) --&gt;
   &lt;s:property value=&quot;top&quot; /&gt;
&lt;/s:iterator&gt;

]]></script>
</div></div>


<p></p><p>Another way to create a simple loop, similar to JSTL's
&lt;c:forEach begin="..." end="..." ...&gt; is to use some 
OGNL magic, which provides some under-the-covers magic to 
make 0-n loops trivial. This example also loops five times.</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

&lt;s:iterator status=&quot;stat&quot; value=&quot;(5).{ #this }&quot; &gt;
   &lt;s:property value=&quot;#stat.count&quot; /&gt; &lt;!-- Note that &quot;count&quot; is 1-based, &quot;index&quot; is 0-based. --&gt;
&lt;/s:iterator&gt;

]]></script>
</div></div>


<p></p><p>A loop that iterates over a partial list</p>

<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[

&lt;s:iterator value=&quot;{1,2,3,4,5}&quot; begin=&quot;2&quot; end=&quot;4&quot; &gt;
   &lt;!-- current iteration value (2,3,4) --&gt;
   &lt;s:property value=&quot;top&quot; /&gt;
&lt;/s:iterator&gt;

]]></script>
</div></div></div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
